package top.wshape1.shiziapi.uaa.service;

import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.multipart.MultipartFile;
import top.wshape1.shiziapi.common.domain.vo.PageVo;
import top.wshape1.shiziapi.uaa.domain.User;
import top.wshape1.shiziapi.uaa.domain.vo.InfoVo;
import top.wshape1.shiziapi.uaa.domain.vo.MemberVo;
import top.wshape1.shiziapi.uaa.domain.vo.PasswordVo;
import top.wshape1.shiziapi.uaa.domain.vo.UserLoginVo;

import java.util.Collection;
import java.util.List;

/**
 * @author Wshape1
 * @description 针对表【t_user】的数据库操作Service
 * @since 2023-08-22 15:01:00
 */
public interface UserService extends IService<User> {

    /**
     * 登录
     *
     * @param userLoginVo 包含用户登录信息的UserVo对象。
     * @return 在成功验证后的JSON Web Token（JWT）字符串及User对象。
     */
    String login(UserLoginVo userLoginVo);

    /**
     * 注销登录
     *
     * @param user
     */
    void logout(User user);

    /**
     * 发送邮件验证码
     *
     * @param email
     */
    void sendRegCode(String email);

    /**
     * 发送重置密码的邮件
     *
     * @param email
     */
    void sendForgetUrl(String email);

    /**
     * 用户注册
     *
     * @param userLoginVo
     */
    void reg(UserLoginVo userLoginVo);

    /**
     * 通过Base64加密的字串 解密获取user
     *
     * @param userEncoded
     * @return
     */
    User getFromEncodedString(String userEncoded);

    /**
     * 用户密码重置
     *
     * @param userLoginVo
     */
    void resetPassword(UserLoginVo userLoginVo);

    /**
     * 修改密码
     *
     * @param user       user
     * @param passwordVo 新密码和旧密码
     */
    void modifyPassword(User user, PasswordVo passwordVo);

    /**
     * 发送邮箱绑定的验证码
     *
     * @param user
     * @param email
     */
    void sendBindingCode(User user, String email);

    /**
     * 绑定邮箱
     *
     * @param user
     * @param email
     * @param password
     * @param code
     */
    void bindingEmail(User user, String email, String password, String code);

    /**
     * 解绑邮箱、Github或Gitee
     *
     * @param user
     * @param type email, gitee and github
     */
    void unbinding(User user, String type);

    /**
     * 修改信息
     *
     * @param user
     * @param infoVo
     * @param file
     * @return
     */
    boolean modifyInfo(User user, InfoVo infoVo, MultipartFile file);

    /**
     * 获取指定用户的部分信息，用户项目成员展示
     * @param page
     * @param limit
     * @param userIds
     * @return
     */
    PageVo getMemberPage(Long page, Long limit, Collection<Long> userIds);

    /**
     * 获取用户的部分信息
     * @param id
     * @return
     */
    MemberVo getMemberById(Long id);
}
